Skip to content

feat(e2e): cluster-free local E2E harness (legacy app, Tier B)#5005

Open
gustavolira wants to merge 18 commits into
redhat-developer:mainfrom
gustavolira:rhidp-15075-cluster-free-e2e-harness
Open

feat(e2e): cluster-free local E2E harness (legacy app, Tier B)#5005
gustavolira wants to merge 18 commits into
redhat-developer:mainfrom
gustavolira:rhidp-15075-cluster-free-e2e-harness

Conversation

@gustavolira

@gustavolira gustavolira commented Jun 23, 2026

Copy link
Copy Markdown
Member

Summary

Adds a cluster-free E2E harness for RHDH: run the existing Playwright specs against a real RHDH instance without an OpenShift/Kubernetes cluster or container image build. Playwright boots the backend and the legacy app (packages/app) dev servers in-process, installs dynamic plugins from the public OCI registry (ghcr, via skopeo — no source build), and drives the browser against them.

Part of RHIDP-13501 (E2E Test Optimization), Layer 4a spike RHIDP-15075.

Status: 4 tests green in CI ✅

The GitHub Actions job (.github/workflows/e2e-cluster-free.yaml) runs cluster-free and passes in ~3.5 min:

✓ guest-signin-happy-path › Homepage renders with Search Bar, Quick Access and Starred Entities
✓ guest-signin-happy-path › Verify Profile is Guest in the Settings page
✓ guest-signin-happy-path › Sign Out and Verify that you return to the Sign-in page
✓ learning-path-page      › Links in Learning Paths open in a new tab
  4 passed (1.5m)

Install (cached): ~90s · Populate plugins from OCI: ~11s · Boot + run: ~2m

The full guest-signin-happy-path spec passes unmodified — including Settings/Sign-out, which navigate through the global-header dynamic plugin's profile dropdown.

How it works

  1. Install deps + skopeo (Playwright container v1.61.1-noble — browsers preinstalled).
  2. Populate dynamic-plugins-root via ./e2e-tests/local-harness/populate.sh — the single source of truth for the populate step (CI, docs, and the fail-fast globalSetup message all point to it). It installs the plugin set from e2e-tests/local-harness/dynamic-plugins.yaml (dynamic-home-page + global-header, from ghcr) with the CLI pinned to the version CI uses.
  3. yarn e2e:legacy-local — boots backend + legacy app with the config overlay, guest auth, and runs the specs.

Test scoping uses a @cluster-free tag + a testMatch file allowlist: enabling a validated spec is tagging the test and adding its file to testMatch.

The global-header fix (why Settings/Sign-out work now)

The repo's static app-config.dynamic-plugins.yaml only mounts the bare GlobalHeader container with no children, so off-cluster the header rendered empty. In-cluster, the full mount points (ProfileDropdown, Settings/Sign-out items, search) come from the plugin's pluginConfig in the catalog index. The harness now carries that canonical pluginConfig (copied from rhdh-plugins workspaces/global-header/.../app-config.dynamic.yaml) on the OCI entry, and the webServer loads the generated dynamic-plugins-root/app-config.dynamic-plugins.yaml last — the same file and merge order the production container uses. This pattern generalizes to any plugin whose config is not in the repo's static file.

Why OCI instead of the catalog index

The catalog index's dynamic-plugins.default.yaml references core plugins via local ./dynamic-plugins/dist/… paths that only exist after a source build (which CI doesn't do). The overlays repo publishes those plugins as OCI artifacts, which install-dynamic-plugins can pull with skopeo directly — no build.

Scope / follow-ups

  • Runs 4 tests today (full guest-signin + learning-paths). Next candidates mapped in docs/e2e-tests/local-e2e-harness.md (Known issues): settings.spec.ts needs the CI catalog test entities, home-page-customization.spec.ts needs the CI home-card customization — follow-up PRs (spec inventory tracked as RHIDP-15076).
  • OCI tags are backstage 1.49.4 (RHDH is on 1.52.0); they load fine, but bump when the overlays repo publishes matching tags (noted in the config file).
  • Overlay plugin tests are out of scope here — they get their own PR in the overlay repo.
  • Not wired into any required check yet; it's an additive cluster-free job.

🤖 Generated with Claude Code

Run real Playwright E2E against RHDH without an OpenShift/Kubernetes cluster
or container images — Playwright boots the backend and a frontend dev server
in-process and drives the browser against them.

- Legacy harness (Tier B, recommended): targets packages/app with dynamic
  plugins loaded via Scalprum, so the EXISTING specs run unmodified. Verified
  the production RHDH home page (Quick Access from the dynamic home-page
  plugin) renders off-cluster and the guest-signin home-page test passes.
- app-next harness: targets the new frontend system; covers core/statically
  registered plugin UIs (dynamic frontend loading is blocked upstream — see doc).
- Shared guest-auth + in-memory-SQLite overlay (app-config.local-e2e.yaml);
  webServer invokes backstage-cli/janus-cli from the repo-root .bin.
- yarn scripts: e2e:legacy-local, e2e:app-next-local.

Part of RHIDP-13501 (E2E Test Optimization), Layer 4a spike RHIDP-15075.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@openshift-ci openshift-ci Bot requested review from alizard0 and josephca June 23, 2026 18:47
@rhdh-qodo-merge

Copy link
Copy Markdown

PR Summary by Qodo

Add cluster-free local Playwright E2E harnesses (legacy Tier B + app-next)
✨ Enhancement 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

Description

• Add Playwright harnesses that boot backend + frontend dev servers in-process, off-cluster.
• Provide legacy Tier B harness to run existing specs unchanged with Scalprum dynamic plugins.
• Document setup, limitations, and add guest-auth + in-memory SQLite config overlay.
Diagram

graph TD
  PW(["Playwright runner"]) --> CH{"Harness"} -->|"Legacy Tier B"| LEG(["Legacy app dev server (janus-cli)"]) --> BR["Browser-driven E2E"]
  CH -->|"app-next"| NEXT(["App-next dev server (backstage-cli)"]) --> BR
  PW --> BE(["Backend dev server (backstage-cli)"]) --> BR
  CFG[["app-config.local-e2e.yaml"]] --> BE
  CFG --> LEG
  CFG --> NEXT
  DPR[("dynamic-plugins-root")] --> LEG
  subgraph Legend
    direction LR
    _svc(["Dev server"]) ~~~ _file[["Config file"]] ~~~ _db[("Plugins root")] ~~~ _dec{"Decision"} ~~~ _box["Test target"]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Single Playwright config with projects (legacy + app-next)
  • ➕ Eliminates duplication of reporters/timeouts/webServer wiring
  • ➕ Allows running one or both harnesses via Playwright project selection
  • ➕ Centralizes env handling (PATH, CI reuseExistingServer)
  • ➖ Slightly more complex conditional webServer setup
  • ➖ Harder to keep legacy testMatch constraints isolated without care
2. Use container-based rhdh-local for local E2E
  • ➕ Closest to production image runtime; fewer dev-server quirks
  • ➕ Avoids needing local workspace CLIs on PATH
  • ➖ Requires container runtime and image pulls
  • ➖ Heavier/slower for automated E2E; contradicts ‘cluster-free/in-process’ goal

Recommendation: Keep the PR’s approach (in-process dev servers via Playwright webServer) because it directly optimizes for fast, cluster-free automated E2E and preserves existing legacy specs unchanged. If this becomes long-lived, consider consolidating common Playwright config into a shared base and using Playwright projects to reduce config duplication while keeping distinct legacy vs app-next server commands.

Files changed (6) +381 / -1

Tests (3) +248 / -0
playwright.app-next-local.config.tsAdd Playwright config to boot backend + app-next dev server +94/-0

Add Playwright config to boot backend + app-next dev server

• Defines a Playwright configuration that starts the backend and packages/app-next dev server via webServer, reusing servers locally and forcing fresh starts in CI. Ensures repo-root .bin CLIs are discoverable via PATH and sets reporting/timeout defaults for the harness.

e2e-tests/playwright.app-next-local.config.ts

playwright.legacy-local.config.tsAdd Tier B Playwright config for legacy app with dynamic plugins +105/-0

Add Tier B Playwright config for legacy app with dynamic plugins

• Creates a legacy harness config that runs a curated subset of existing specs off-cluster. Boots backend and packages/app via backstage-cli/janus-cli with layered configs including dynamic plugins and the local E2E overlay, and reuses servers outside CI.

e2e-tests/playwright.legacy-local.config.ts

guest-identity.spec.tsAdd app-next local guest sign-in + identity smoke test +49/-0

Add app-next local guest sign-in + identity smoke test

• Introduces a minimal E2E spec validating the app-next harness: guest sign-in succeeds, core navigation is present, and the Settings page renders the guest Backstage identity. Assertions intentionally match app-next UI behavior rather than legacy home-page expectations.

e2e-tests/playwright/app-next-local/guest-identity.spec.ts

Documentation (1) +105 / -0
local-e2e-harness.mdDocument cluster-free local E2E harness usage and constraints +105/-0

Document cluster-free local E2E harness usage and constraints

• Adds a dedicated guide describing the legacy Tier B and app-next harnesses, dynamic-plugins-root population paths, and what’s currently verified. Documents key limitations (global-header mounting, app-next dynamic plugin loading, and external-service-dependent specs) and explains why this approach differs from rhdh-local.

docs/e2e-tests/local-e2e-harness.md

Other (2) +28 / -1
app-config.local-e2e.yamlAdd local E2E config overlay (guest auth + in-memory DB) +25/-0

Add local E2E config overlay (guest auth + in-memory DB)

• Introduces a shared config overlay for cluster-free E2E runs. Enables the guest auth provider (including CI-safe allowance) and forces an in-memory better-sqlite3 backend database for fully self-contained runs.

app-config.local-e2e.yaml

package.jsonAdd yarn scripts to run legacy-local and app-next-local harnesses +3/-1

Add yarn scripts to run legacy-local and app-next-local harnesses

• Adds two Playwright entrypoint scripts for the new harness configs. Keeps existing tooling scripts intact while enabling one-command local harness execution.

e2e-tests/package.json

@rhdh-qodo-merge

rhdh-qodo-merge Bot commented Jun 23, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Wrong server reused 🐞 Bug ☼ Reliability
Description
With reuseExistingServer enabled outside CI, Playwright will reuse any process responding on the
configured localhost URLs, even if it's not the intended RHDH harness. Because the URLs are
hard-coded to localhost:3000 and localhost:7007, this can lead to tests running against
stale/foreign servers and producing misleading results.
Code

e2e-tests/playwright.legacy-local.config.ts[R88-100]

+      url: backendReadiness,
+      reuseExistingServer: !process.env.CI,
+      timeout: 180 * 1000,
+      stdout: "pipe",
+      stderr: "pipe",
+    },
+    {
+      command: `janus-cli package start ${sharedConfigArgs}`,
+      cwd: "../packages/app",
+      env: { ...process.env, PATH: `${repoRootBin}:${process.env.PATH}` },
+      url: frontendUrl,
+      reuseExistingServer: !process.env.CI,
+      timeout: 240 * 1000,
Relevance

⭐⭐ Medium

No prior review evidence on reuseExistingServer risks; pattern likely tolerated for local dev but
could be tightened.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Both configs hard-code the target URLs/ports and enable reuse of any existing server when CI is
not set, which makes it possible to run tests against an unintended process bound to those ports.

e2e-tests/playwright.legacy-local.config.ts[31-33]
e2e-tests/playwright.legacy-local.config.ts[88-100]
e2e-tests/playwright.app-next-local.config.ts[24-26]
e2e-tests/playwright.app-next-local.config.ts[75-89]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The harness sets `reuseExistingServer: !process.env.CI` while targeting fixed `http://localhost:3000` and `http://localhost:7007/...`. If anything else is listening on those ports (or a previous run is still alive), Playwright may attach to the wrong process.

### Issue Context
This affects both `playwright.legacy-local.config.ts` and `playwright.app-next-local.config.ts`.

### Fix
Pick one:
1) Make reuse explicit (opt-in), e.g. `reuseExistingServer: process.env.REUSE_EXISTING_SERVER === 'true'`.
2) Use per-run ports (random/free port) and pass them into backend/frontend via config/env overrides, and derive `baseURL`/readiness URLs from those ports.
3) Add a lightweight identity check before reusing (e.g., fetch a known endpoint and validate a header/body) and fail if it doesn’t match.

### Fix Focus Areas
- e2e-tests/playwright.legacy-local.config.ts[31-33]
- e2e-tests/playwright.legacy-local.config.ts[88-100]
- e2e-tests/playwright.app-next-local.config.ts[24-26]
- e2e-tests/playwright.app-next-local.config.ts[75-89]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

2. NODE_OPTIONS clobbered 🐞 Bug ☼ Reliability
Description
The local harness webServer env sets NODE_OPTIONS to a fixed value, overwriting any pre-existing
NODE_OPTIONS from the environment. This can break harness startup in CI/dev setups that rely on
other Node flags (e.g., memory limits or preload hooks).
Code

e2e-tests/playwright.legacy-local.config.ts[R83-87]

+      env: {
+        ...process.env,
+        PATH: `${repoRootBin}:${process.env.PATH}`,
+        NODE_OPTIONS: "--no-node-snapshot",
+      },
Relevance

⭐ Low

Repo already sets NODE_OPTIONS="--no-node-snapshot" unconditionally in Docker/CI; clobbering appears
accepted.

PR-#2297

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Both harness configs spread ...process.env but then unconditionally override NODE_OPTIONS, which
discards any upstream flags.

e2e-tests/playwright.legacy-local.config.ts[83-87]
e2e-tests/playwright.app-next-local.config.ts[70-74]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The Playwright `webServer.env` blocks replace `NODE_OPTIONS` with `"--no-node-snapshot"`, which drops any existing `NODE_OPTIONS` settings inherited from the parent environment.

### Issue Context
This affects both the legacy and app-next local harness configs.

### Fix
Construct `NODE_OPTIONS` by appending `--no-node-snapshot` to any existing value, e.g.:

```ts
const nodeOptions = [process.env.NODE_OPTIONS, '--no-node-snapshot']
 .filter(Boolean)
 .join(' ');

NODE_OPTIONS: nodeOptions,
```

### Fix Focus Areas
- e2e-tests/playwright.legacy-local.config.ts[83-87]
- e2e-tests/playwright.app-next-local.config.ts[70-74]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

- Scope legacy testMatch to the spec verified to pass off-cluster
  (learning-path-page); document the others as pending the global-header
  mount fix / per-spec config so the default run is green.
- Guard PATH interpolation against an undefined process.env.PATH via a
  shared pathWithRepoBin constant in both configs.
- Default CATALOG_INDEX_IMAGE to quay.io/rhdh/plugin-catalog-index:latest
  for main (release branches use the matching :1.y tag).
- Note that the guest-auth overlay is test-only and must never reach a
  production config; drop a duplicated comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

The chosen direction is the legacy cluster-free harness (packages/app), which
runs the existing specs unmodified. The app-next harness can't load dynamic
plugins yet (blocked upstream), so it's removed from this PR and tracked as a
follow-up; a short note in the doc records why legacy is the target.

- Remove playwright.app-next-local.config.ts and its guest-identity.spec.ts.
- Remove the e2e:app-next-local script.
- Make the overlay and docs legacy-only (keep a "why not app-next yet" note).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gustavolira gustavolira changed the title feat(e2e): cluster-free local E2E harness (legacy Tier B + app-next) feat(e2e): cluster-free local E2E harness (legacy app, Tier B) Jun 23, 2026
- Scope the default run to the one verified-green test (guest-signin
  home-page) via testMatch + grep, instead of an unvalidated spec whose
  sidebar navigation may not match the harness config.
- Add a globalSetup that fails fast with the populate command when
  dynamic-plugins-root is empty (clear error instead of a locator timeout).
- Build the shared --config args via array join; document workers=1 and that
  the backend command mirrors packages/backend's start script.
- Doc: describe the grep-scoped default run and the fail-fast guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

@codecov

codecov Bot commented Jun 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 54.77%. Comparing base (5c9e678) to head (ee3120b).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #5005      +/-   ##
==========================================
- Coverage   55.39%   54.77%   -0.62%     
==========================================
  Files         122      110      -12     
  Lines        2365     2147     -218     
  Branches      563      538      -25     
==========================================
- Hits         1310     1176     -134     
+ Misses       1049      969      -80     
+ Partials        6        2       -4     
Flag Coverage Δ
rhdh 54.77% <ø> (-0.62%) ⬇️

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5c9e678...ee3120b. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

…h 80)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

@gustavolira

Copy link
Copy Markdown
Member Author

/test e2e-ocp-helm-nightly

Add .github/workflows/e2e-cluster-free.yaml: a no-cluster job that installs
deps + skopeo, populates dynamic-plugins-root from the public catalog index
via the install-dynamic-plugins CLI (same mechanism as the nightly sanity
check), boots the backend + legacy app dev servers in-process, and runs
yarn e2e:legacy-local. Triggers on e2e-tests/** and app-config*.yaml.

Follows the project workflow-security rules: pull_request (no secrets, public
image), pinned action SHAs, minimal permissions, concurrency control.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

The 'Install Playwright browser' step hung on 'playwright install --with-deps'
(its apt phase); drop --with-deps since ubuntu-latest already has the libs
headless chromium needs. Add setup-node yarn caching for both lockfiles to cut
the slow root install on subsequent runs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

Use mcr.microsoft.com/playwright:v1.59.1-noble (browsers + OS deps
preinstalled, matching @playwright/test 1.59.1) to eliminate the
playwright-install step that hung on plain ubuntu runners. Enable corepack
for the vendored yarn 4 and cache the yarn global cache explicitly (the
container lacks the yarn binary setup-node's cache relies on).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gustavolira and others added 2 commits June 30, 2026 15:37
…ree-e2e-harness

# Conflicts:
#	e2e-tests/package.json
…ation

main migrated e2e-tests from ESLint/Prettier/tsc to oxlint + oxfmt. Reformat
the harness files with oxfmt and satisfy oxlint: a shared isCI constant
(process.env.CI !== undefined && !== ''), nullish coalescing, the regexp u
flag, and no inline comments. Matches the pattern in playwright.config.ts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

The merge with main bumped @playwright/test to 1.61.1, but the container was
pinned at v1.59.1-noble, so the browser launch failed with 'Executable
doesn't exist at /ms-playwright/chromium_headless_shell-1228/...'. Match the
container tag to the package version. (Populate + backend + frontend already
came up fine in CI — only the browser version was off.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

gustavolira and others added 2 commits July 1, 2026 17:24
The previous populate (plugins: []) installed 0 plugins, so the home page
404'd and the test failed waiting for 'Welcome back!'. The catalog index's
default.yaml references core plugins via local ./dynamic-plugins/dist paths
that need a source build, which CI doesn't do.

Instead, install the dynamic-home-page frontend plugin from the public OCI
registry (ghcr, via skopeo) — no build needed. app-config.dynamic-plugins.yaml
already configures it (route / -> DynamicHomePage + QuickAccessCard), so the
guest-signin home-page test renders off-cluster.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l-header OCI

Install the global-header plugin from OCI (top bar + profile dropdown) so the
Settings and Sign-out specs render, and drop the grep so all three
guest-signin-happy-path tests run off-cluster (home + settings + sign-out).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

The global-header plugin loads off-cluster but does not mount in the layout with
the default config, so the Settings/Sign-out specs can't run yet. Revert to the
verified-green home-page test; global-header rendering + those specs are a
follow-up (noted in local-harness/dynamic-plugins.yaml).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

gustavolira and others added 2 commits July 2, 2026 11:27
…iew fixes

Apply the code-review findings on the cluster-free harness:

- Extract the dynamic-plugins-root populate step into
  e2e-tests/local-harness/populate.sh — the single source of truth used by
  CI, the docs, and the global-setup error message (they had already
  diverged: CI installed the harness OCI set pinned to CLI 0.2.0 while the
  docs/error message pointed at the catalog index, unversioned).
- Drop the unused CATALOG_INDEX_IMAGE env from the workflow: with the
  harness dynamic-plugins.yaml (no includes), the CLI only used it to
  extract a catalog index that nothing consumed — a wasted :latest quay
  pull on every run. Fix the workflow header comment accordingly (plugins
  come from ghcr OCI, not the catalog index).
- Scope the harness run by a @cluster-free test tag instead of a title
  regex; widening coverage is now tagging the validated test and
  allowlisting its spec file in testMatch.
- Count only directories in the global-setup guard: the installer writes
  its generated global-config file into dynamic-plugins-root even when
  zero plugins install, which previously satisfied the guard and produced
  the confusing locator timeout it exists to prevent.
- Rewrite the docs populate section: the OCI/populate.sh path (what CI
  uses, works from a fresh clone) is primary; the catalog-index path is
  demoted to after-source-build use since its default.yaml references
  ./dynamic-plugins/dist paths that don't exist otherwise.
- Gitignore the root dynamic-plugins.yaml copy the populate script leaves
  behind (the CLI hardcodes that path).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expand the harness from 1 to 4 tests by fixing the global-header mounting
and enabling the learning-paths spec:

- global-header: the repo's static app-config.dynamic-plugins.yaml only
  mounts the bare GlobalHeader container with no children, which is why the
  plugin loaded but rendered nothing off-cluster. In-cluster the full mount
  points (ProfileDropdown, Settings/Sign-out menu items, search, etc.) come
  from the plugin's pluginConfig in the catalog index. Install the plugin
  from OCI with that canonical pluginConfig (copied from rhdh-plugins
  workspaces/global-header app-config.dynamic.yaml) and load the generated
  dynamic-plugins-root/app-config.dynamic-plugins.yaml last in the
  webServer config args — the same file and merge order the production
  container uses. This unblocks the guest-signin Settings and Sign-out
  tests, which navigate via the header's profile dropdown.
- learning-paths: the page renders off-cluster from the static fallback
  data bundled with packages/app. The spec navigates through the
  "References" sidebar group, which is a CI config-map menu customization —
  mirror that menuItems nesting in app-config.local-e2e.yaml (objects
  deep-merge across config files, so only the nesting keys are needed).
- Tag the three newly validated tests @cluster-free and allowlist
  learning-path-page.spec.ts in testMatch.
- settings.spec.ts and home-page-customization.spec.ts stay out for now:
  they assert CI test data (catalog ownership entities, customized home
  cards) that the harness does not provide yet — documented in Known
  issues.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

@openshift-ci

openshift-ci Bot commented Jul 2, 2026

Copy link
Copy Markdown

@gustavolira: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-ocp-helm-nightly 1bf02b5 link false /test e2e-ocp-helm-nightly

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

…k name

The PR check now reads "E2E Cluster-free / e2e (pull_request)" instead of
"E2E Cluster-free Harness / Cluster-free E2E (legacy app) (pull_request)",
matching the naming style of the sibling E2E workflows. The "(pull_request)"
suffix is appended by GitHub (trigger event) and cannot be removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gustavolira added a commit to gustavolira/rhdh that referenced this pull request Jul 2, 2026
…tion, path prefixes

- Mark harnesses that are still in review and instruct the assistant to
  verify paths exist on main before recommending them (the skill referenced
  redhat-developer#5005/redhat-developer#5044/redhat-developer#2714/redhat-developer#4967 deliverables in present tense).
- Describe the overlays native smoke's real interface: yarn smoke
  --dynamic-plugins <file> [--out] (no --workspace flag exists; the harness
  does not read workspaces/*/metadata — a workspace run is a dp.yaml listing
  its oci:// refs).
- Replace the fork-only RHIDP-13235-layer3-component-tests branch pointer
  with the closed PR rhdh#4864.
- Prefix every path with its repo (rhdh:/overlays:/plugins:) and use full
  URLs for cross-repo docs, so the skill resolves from any of its three homes.
- Fix skopeo claim: it installs on macOS via brew; CI has it preinstalled.
- Name the Docker smoke location (overlays smoke-tests/ +
  run-workspace-smoke-tests.yaml), replace the vague "any" repo cell, use
  "n/a (cluster)" for the cluster row's Docker column, move PR numbers to
  References with status, add trigger phrases to the frontmatter description,
  and deduplicate the guiding-rule sentence.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The populate script and harness doc claimed skopeo is "not available on
macOS"; it is (brew install skopeo). The real point is that CI has it
preinstalled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

The container image build workflow finished with status: cancelled.

@sonarqubecloud

sonarqubecloud Bot commented Jul 2, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Image was built and published successfully. It is available at:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant